package com.chen.base.utils;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.experimental.UtilityClass;

import java.util.ArrayList;
import java.util.List;


/**
 * JSON工具类
 * @author ChenJinLong
 */
@UtilityClass
public class JsonUtil {

    /**
     * 校验字符串是否是 json 格式
     * @param json json字符串
     * @return true-是 json 格式
     */
    public boolean isJson(Object json){
        if (StrUtil.isBlankIfStr(json)){
            return false;
        }

        return isJson(json.toString());
    }

    /**
     * 校验字符串是否是 json 格式
     * @param json json字符串
     * @return true-是 json 格式
     */
    public boolean isJson(String json) {
        if(StrUtil.isBlank(json)){
            return false;
        }
        boolean isJsonObject = true;
        boolean isJsonArray = true;
        try {
            JSONObject.parseObject(json);
        } catch (Exception e) {
            isJsonObject = false;
        }
        try {
            JSONObject.parseArray(json);
        } catch (Exception e) {
            isJsonArray = false;
        }

        return isJsonObject || isJsonArray;
    }

    public static <T> T parseObj(String jsonStr, String keys, Class<T> tClass){
        return parseObj(JSONObject.parseObject(jsonStr), keys, tClass);
    }

    /**
     * 解析路径集中的数据
     * @param json json对象
     * @param keys 路径集，支持: aa.bb.cc
     * @return json对象
     */
    public static <T> T parseObj(JSONObject json, String keys, Class<T> tClass){
        if (keys.contains(".")){
            String[] split = keys.split("\\.");
            keys = split[split.length - 1];

            for (int i = 0; i < split.length - 1; i++) {
                json = json.getJSONObject(split[i]);
            }
        }

        return json != null ? json.getObject(keys, tClass) : null;
    }

    public static <T> List<T> parseArray(String jsonStr, String keys, Class<T> tClass){
        return parseArray(JSONObject.parseObject(jsonStr), keys, tClass);
    }

    /**
     * 解析路径集中的集合数据
     * @param json json对象
     * @param keys 路径集，支持: aa.bb.cc
     * @return json对象
     */
    public static <T> List<T> parseArray(JSONObject json, String keys, Class<T> tClass){
        if (keys.contains(".")){
            String[] split = keys.split("\\.");
            keys = split[split.length - 1];

            for (int i = 0; i < split.length - 1; i++) {
                json = json.getJSONObject(split[i]);
            }
        }

        List<T> list = JSONArray.parseArray(JSONUtil.toJsonStr(json.get(keys)), tClass);
        return list != null ? list : new ArrayList<>();
    }

    public static void main(String[] args) {
        String s = "{\"data\":[1,2,3], " +
                "\"h\":{\"abc\":[444,555,666], " +
                "\"c\":{\"ddd\":[999,100],\"d\":{\"hh\":\"str\"}}}}";
        JSONObject jsonObject = JSONObject.parseObject(s);
        System.out.println(parseArray(jsonObject, "h.c.ddd", Integer.class));
        System.out.println(parseObj(jsonObject, "h.c.d", JSONObject.class));
    }
}

